#include "pch.h"

#include "math\gl\glfloat4.h"
#include "core/config.h"

#if defined RE_USE_DX || defined RE_USE_SSE
#else

namespace Math
{

	//////////////////////////////////////////////////////////////////////////
	float4::float4():
	m_x(0.0f),
		m_y(0.0f),
		m_z(0.0f),
		m_w(0.0f)
	{

	}


	//////////////////////////////////////////////////////////////////////////
	float4::float4(scalar x, scalar y, scalar z, scalar w):
	m_x(x),
		m_y(y),
		m_z(z),
		m_w(w)
	{

	}





	//////////////////////////////////////////////////////////////////////////
	void float4::operator=(const float4 & rhs)
	{
		this->m_x = rhs.m_x;
		this->m_y = rhs.m_y;
		this->m_z = rhs.m_z;
		this->m_w = rhs.m_w;
	}


	//////////////////////////////////////////////////////////////////////////
	bool float4::operator==(const float4 & rhs) const 
	{
		return ((this->m_x == rhs.m_x) && (this->m_y == rhs.m_y) && (this->m_z == rhs.m_z) && (this->m_w == rhs.m_w));
	}


	//////////////////////////////////////////////////////////////////////////
	bool float4::operator!=(const float4 & rhs) const 
	{
		return ((this->m_w != rhs.m_w) || (this->m_x != rhs.m_x) || (this->m_y != rhs.m_y) || (this->m_z != rhs.m_z));
	}


	//////////////////////////////////////////////////////////////////////////
	void float4::operator+=(const float4 & rhs)
	{
		this->m_x += rhs.m_x;
		this->m_y += rhs.m_y;
		this->m_z += rhs.m_z;
		this->m_w += rhs.m_w;
	}


	//////////////////////////////////////////////////////////////////////////
	void float4::operator-=(const float4 & rhs) 
	{
		this->m_x -= rhs.m_x;
		this->m_y -= rhs.m_y;
		this->m_z -= rhs.m_z;
		this->m_w -= rhs.m_w;
	}


	//////////////////////////////////////////////////////////////////////////
	void float4::operator*=(scalar s)
	{
		this->m_x *= s;
		this->m_y *= s;
		this->m_z *= s;
		this->m_w *= s;
	}


	//////////////////////////////////////////////////////////////////////////
	float4 float4::operator-() const 
	{
		return float4(-this->m_x, -this->m_y, -this->m_z, -this->m_w);
	}


	//////////////////////////////////////////////////////////////////////////
	float4 float4::operator+(const float4 & rhs) const 
	{
		return float4(this->m_x + rhs.m_x,
					  this->m_y + rhs.m_y,
					  this->m_z + rhs.m_z,
					  this->m_w + rhs.m_w);
	}


	//////////////////////////////////////////////////////////////////////////
	float4 float4::operator-(const float4 & rhs) const 
	{
		return float4(this->m_x - rhs.m_x,
					  this->m_y - rhs.m_y,
					  this->m_z - rhs.m_z,
					  this->m_w - rhs.m_w);
	}


	//////////////////////////////////////////////////////////////////////////
	float4 float4::operator*(scalar s) const 
	{
		return float4(this->m_x * s,
					  this->m_y * s,
					  this->m_z * s,
					  this->m_w * s);
	}





	//////////////////////////////////////////////////////////////////////////
	void float4::set(scalar x, scalar y, scalar z, scalar w)
	{
		this->m_x = x;
		this->m_y = y;
		this->m_z = z;
		this->m_w = w;
	}


	//////////////////////////////////////////////////////////////////////////
	void float4::setx(scalar x)
	{
		this->m_x = x;
	}


	//////////////////////////////////////////////////////////////////////////
	void float4::sety(scalar y)
	{
		this->m_y = y;
	}


	//////////////////////////////////////////////////////////////////////////
	void float4::setz(scalar z)
	{
		this->m_z = z;
	}


	//////////////////////////////////////////////////////////////////////////
	void float4::setw(scalar w)
	{
		this->m_w = w;
	}


	//////////////////////////////////////////////////////////////////////////
	scalar & float4::getx()
	{
		return this->m_x;
	}


	//////////////////////////////////////////////////////////////////////////
	scalar & float4::gety()
	{
		return this->m_y;
	}


	//////////////////////////////////////////////////////////////////////////
	scalar & float4::getz()
	{
		return this->m_z;
	}


	//////////////////////////////////////////////////////////////////////////
	scalar & float4::getw()
	{
		return this->m_w;
	}


	//////////////////////////////////////////////////////////////////////////
	scalar float4::getx() const 
	{
		return this->m_x;
	}


	//////////////////////////////////////////////////////////////////////////
	scalar float4::gety() const 
	{
		return this->m_y;
	}


	//////////////////////////////////////////////////////////////////////////
	scalar float4::getz() const 
	{
		return this->m_z;
	}


	//////////////////////////////////////////////////////////////////////////
	scalar float4::getw() const 
	{
		return this->m_w;
	}



	//////////////////////////////////////////////////////////////////////////
	scalar float4::length() const 
	{
		return r_sqrt(this->m_x * this->m_x + this->m_y * this->m_y + this->m_z * this->m_z);
	}


	//////////////////////////////////////////////////////////////////////////
	scalar float4::lengthsq() const 
	{
		return this->m_x * this->m_x + this->m_y * this->m_y + this->m_z * this->m_z;
	}


	//////////////////////////////////////////////////////////////////////////
	float4 float4::abs() const 
	{
		return float4(r_abs(this->m_x),
					  r_abs(this->m_y),
					  r_abs(this->m_z),
					  r_abs(this->m_w));
	}


}

#endif //